package com.cy.ppj.service.order;

import java.util.List;

import com.cy.ppj.model.Result;
import org.springframework.web.multipart.MultipartFile;

import com.cy.ppj.model.PageBean;
import com.cy.ppj.model.ao.order.OrderAdminAddAO;
import com.cy.ppj.model.ao.order.OrderAdminEditAO;
import com.cy.ppj.model.ao.order.OrderAuditAO;
import com.cy.ppj.model.ao.order.OrderExtSetAO;
import com.cy.ppj.model.ao.order.OrderScanRecordComfirmAO;
import com.cy.ppj.model.ao.order.OrderWithholdSetAO;
import com.cy.ppj.model.domian.order.Order;
import com.cy.ppj.model.dto.order.OrderAddDTO;
import com.cy.ppj.model.dto.order.OrderImportDTO;
import com.cy.ppj.model.dto.order.ToDayLoanSuccessOrderCountDTO;
import com.cy.ppj.model.dto.customer.CustomerOrderDTO;
import com.cy.ppj.model.dto.customer.CustomerOrderScanRecordDTO;
import com.cy.ppj.model.enums.OrderStatus;
import com.cy.ppj.model.query.OrderAdminByTypeQuery;
import com.cy.ppj.model.query.OrderAdminQuery;
import com.cy.ppj.model.query.OrderQuery;
import com.cy.ppj.model.query.order.DecorationPassOrderListAdminQuery;
import com.cy.ppj.model.query.order.OrderCountQuery;
import com.cy.ppj.model.query.order.OrderScanRecordAdminQuery;
import com.cy.ppj.model.query.order.OrderScanRecordQuery;
import com.cy.ppj.model.query.order.OrderWithholdAdminQuery;
import com.cy.ppj.model.vo.OrderAdminByTypeVO;
import com.cy.ppj.model.vo.OrderAdminVO;
import com.cy.ppj.model.vo.OrderDetailAdminVO;
import com.cy.ppj.model.vo.OrderDetailVO;
import com.cy.ppj.model.vo.OrderScanRecordDetailVO;
import com.cy.ppj.model.vo.OrderVO;
import com.cy.ppj.model.vo.admin.order.DecorationPassOrderListAdminVO;
import com.cy.ppj.model.vo.admin.order.OrderScanRecordAdminVO;
import com.cy.ppj.model.vo.admin.order.OrderScanRecordVO;
import com.cy.ppj.model.vo.admin.order.OrderWithholdAdminVO;
import com.cy.ppj.model.vo.order.FurnitureGoodsOrderDetailAdminVO;

/**
 * @description: 订单业务
 * @author: tanyilin
 * @create: 2018年7月20日 下午8:13:21
 */
public interface OrderService {

	/**
	 * 添加订单
	 * @param orderAddDTO
	 */
	Result addOrder(OrderAddDTO orderAddDTO);
	
	/**
	 * 编辑更新订单信息
	 * @param order
	 */
	void updateOrder(Order order);
	
	/**
	 * 审核订单
	 * @param orderAuditAO
	 */
	void auditOrder(OrderAuditAO orderAuditAO, Long managerId);
	
	/**
	 * 放款成功时，调用的方法
	 * @param order
	 */
	void orderLoanSuccess(Order order, Long managerId);
	
	/**
	 * 设置订单代扣参数
	 * @param orderWithholdSetAO
	 */
	void setOrderWithhold(OrderWithholdSetAO orderWithholdSetAO);
	
	/**
	 * 外部单号设置
	 * @param orderExtSetAO
	 */
	void setOrderExt(OrderExtSetAO orderExtSetAO);
	
	/**
	 * 前台订单列表
	 * @param orderQuery
	 * @return
	 */
	PageBean<OrderVO> queryOrderList(OrderQuery orderQuery);
	
	/**
	 * 前台订单详情
	 * 
	 * @param orderId
	 * @return
	 */
	OrderDetailVO orderDetail(Long orderId);
	
	/**
	 * 订单分配管理员用户
	 * @param orderId
	 * @param managerId
	 * @return
	 */
	void assignUser(Long orderId, Long managerId);
	
	/**
	 * 后台订单管理列表
	 * @param orderAdminQuery
	 * @return
	 */
	PageBean<OrderAdminVO> queryOrderAdminList(OrderAdminQuery orderAdminQuery);
	
	/**
	 * 后台-根据类型参数type查询订单明细
	 * @param query
	 * @return
	 */
	PageBean<OrderAdminByTypeVO> queryOrderAdminByType(OrderAdminByTypeQuery query);

	/**
	 * 后台代扣列表
	 * @param query
	 * @return
	 */
	PageBean<OrderWithholdAdminVO> queryOrderWithholdAdminList(OrderWithholdAdminQuery query);

	/**
	 * 后台-浏览记录列表
	 * @param query
	 * @return
	 */
	PageBean<OrderScanRecordAdminVO> selectOrderScanRecordAdmin(OrderScanRecordAdminQuery query);

	/**
	 * 后台-确认或者退回订单浏览记录
	 * @param orderId
	 * @param orderStatus
	 * @param managerId
	 */
	void doConfirmOrReturnOrderScanRecord(Long orderId, OrderStatus orderStatus, Long managerId);

	/**
	 * 后台-浏览记录列表
	 * @param query
	 * @return
	 */
	PageBean<OrderScanRecordVO> selectOrderScanRecord(OrderScanRecordQuery query);
	
	/**
	 * 订单浏览记录信息
	 * 
	 * @param orderId
	 * @return
	 */
	OrderScanRecordDetailVO selectOrderScanRecordDetail(Long orderId);

	/**
	 * 前台-交单动作
	 * 
	 * @param orderScanRecordComfirmAO
	 */
	void doConfirmOrderScanRecord(OrderScanRecordComfirmAO orderScanRecordComfirmAO);

	/**
	 * 后台-全部订单列表
	 * 
	 * @param query
	 * @return
	 */
	PageBean<OrderAdminVO> selectAllOrderAdminList(OrderAdminQuery query);

	/**
	 * 后台-待接单（未分配）订单列表
	 * 
	 * @param query
	 * @return
	 */
	PageBean<OrderAdminVO> selectUnassignedOrderAdminList(OrderAdminQuery query);

	/**
	 * 后台-处理中订单列表
	 * 
	 * @param query
	 * @return
	 */
	PageBean<OrderAdminVO> selectProcessingOrderAdminList(OrderAdminQuery query);

	/**
	 * 后台-已批款订单列表
	 * 
	 * @param query
	 * @return
	 */
	PageBean<OrderAdminVO> selectPassOrderAdminList(OrderAdminQuery query);

	/**
	 * 后台-已拒绝订单列表
	 * 
	 * @param query
	 * @return
	 */
	PageBean<OrderAdminVO> selectRejectOrderAdminList(OrderAdminQuery query);
	
	/**
	 * 查询今日交单数
	 * 
	 * @return
	 */
	int selectToDayApplyOrderCount(OrderCountQuery query);
	
	/**
	 * 查询今日批款单数
	 * 
	 * @return
	 */
	ToDayLoanSuccessOrderCountDTO selectToDayLoanSuccessOrderCount(OrderCountQuery query);
	
	/**
	 * 查询今日拒绝单数
	 * 
	 * @return
	 */
	int selectToDayRejectOrderCount(OrderCountQuery query);
	
	/**
	 * 同一客户，同一产品，最后的审核通过时间
	 * 
	 * @param idNo
	 * @param productId
	 * @return
	 */
	CustomerOrderDTO selectCustomerOrderDTO(String idNo, Long productId);
	
	/**
	 * 提交浏览记录时，进行另外的限制
	 * 
	 * @param idNo
	 * @param productId
	 * @return
	 */
	CustomerOrderScanRecordDTO selectCustomerOrderScanRecordDTO(String idNo, Long productId);

	List<OrderImportDTO> getOrderImportDTO(MultipartFile file);

	void importOrder(List<OrderImportDTO> orderImportList);
	
	PageBean<DecorationPassOrderListAdminVO> selectDecorationPassOrderListAdmin(DecorationPassOrderListAdminQuery query);

	/**
	 * 后台-新增订单
	 * 
	 * @param addAO
	 */
	void addOrder(OrderAdminAddAO addAO, Long managerId);
	
	/**
	 * 后台-订单详情
	 * 
	 * @return
	 */
	OrderDetailAdminVO selectOrderDetailAdminVO(Long orderId);

	/**
	 * 后台-编辑订单
	 * 
	 * @param editAO
	 */
	void updateOrder(OrderAdminEditAO editAO);

	/**
	 * 后台-家具分期商品订单详情
	 * 
	 * @param orderId
	 * @return
	 */
	FurnitureGoodsOrderDetailAdminVO selectFurnitureGoodsOrderDetailAdminVO(Long orderId);
}
